历史注记

  我发明了C++,写出了它的第一个定义,做出了它的第一个实现。我选择并整理出C++的设计准则,设计了它的所有主要特征,并在C++标准化委员会里负责处理扩充建议。

  很清楚,C++大大地受惠于C[Kernighan,1978]。除封闭了其类型系统中的少量严重漏洞之外(附录B),C++仍保留C作为一个子集。我还保留了C在功能上的强项,能在足够低的层次上处理最苛刻的系统程序设计工作。C转而从其前驱BCPL[Richards,1980]受惠颇多;事实上,BCPL的//注释约定也被(重新)引进了C++。给C++以灵感的另一个主要来源是Simula67 [Dahl,1970][Dahl,1972];类的概念(包括派生类和虚函数)都是从那里搬过来的。C++有关重载运算符和自由地将声明放置在可以出现语句的任何位置的功能,使人联想到Algo169[Woodward,1974]。

  在本书的第一版之后,这个语言已经经过广泛的审查和精炼。审查的主要部分是对于重载的解析、连接、以及存储管理功能。此外还做了许多小修改,以增强与C的兼容性。还加进了一些推广和若干主要的扩充,包括:多重继承、statci成员函数、const成员函数、protected成员、模版、异常处理、运行时类型识别和名字空间。所有这些扩充和修订的主旨都是为了使C++能够成为一个编写库、使用库的更好的语言。有关C++演化过程的描述参见[Stroustrup,1994]。

  模版功能的设计,从根本上说,是为了支持静态类型的容器(如表、向量和映射),以及优雅有效地使用这些容器(通用型程序设计)。这里的一个关键目标是减少宏和强制(显式类型转换)的使用。模板机制部分地受到Ada中类属的启发(包括其威力及其弱点),部分地受到Clu语言参数化模块的影响。与此类似,C++的异常处理机制部分地受到Ada[Ichbian,1979]、Clu[Liskov,1979]和ML[Wikstrom,1987]的影响。其他方面的开发是在1985~1995年的时间跨度中做出的,例如,多重继承、纯虚函数,以及名字空间,这些基本上是在C++使用经验推动下推广而来,而不是由其他语言引进的。

  这个语言的早期版本是大家都知道的“带类的C”[Stroustrup,1994],它从1980年开始使用。初始发明这个语言,是因为我想去写某些事件驱动的模拟程序,Simular67可能对于它们是最理想的,除了效率考虑之外。“带类的C”被用在一些主要的项目上,这使其用于写那种使用最少的时间和空间的程序的功能得到了严格的检验。这个语言缺乏运算符重载、引用、虚函数、模板、异常和许多细节。C++在研究组织之外的最初使用是在1983年。

  名字C++(读作“see plus plus”)是Rick Mascitti在1983年夏天起的名字。这个名字象征着从C改变过来的演化性质;“++”是C的增量运算符。稍微短一点的名字“C+”则是个语法错误,它也曾被用于另一个与C++毫无关系的语言。C的语义权威们认为C++不如++C。它没有被称做D是因为它是C的一个扩充,而且也从未打算通过删除某些特征去修正一些问题。对于名字C++的另一种解释,请参看[Orwell,1949]的附录。

  C++原始的基本设计就是为了使我的朋友和我不必去用汇编、C或各种摩登的高级语言写程序。它的主要用途是为了那些作为个人的程序员,使它们能更容易和更愉快地写出好的程序来。在早期的那些年里根本就没有C++的纸面设计;设计、文档和实现是平行开展的。从来没有一个“C++项目”或者“C++设计委员会”。自始自终,C++的演化就是为了面对用户遇到的问题,也是在我的朋友、同事喝喔之间讨论的结果。

  后来,C++使用的爆炸性增长导致情况产生了某些变化。在1987年的某个时候,情况已经很清楚,C++的标准化已是一件不可避免的事情了,我们需要开始去为标准化工作准备一个基础[Stroustrup,1994]。这导致了一种有意识的努力,去维持C++编译器的实现者们和主要用户之间的联系,通过文章和电子邮件,也通过在C++会议和其他各种场合中面对面的讨论。

  AT&T的贝尔实验室对这个工作做出了主要的贡献,它允许我将C++参考手册的草稿和各种修订版本提供给实现者和用户共享。由于这些人中的许多事为那些可以看做是AT&T的竞争对手的公司工作的,这种分发的价值怎样估计都不过分。一个不那么光明磊落的公司可能早就导致了严重的语言分裂局面,为此它只要什么都不做也就够了。在那个时候,大约一百个人,来自数是个组织,阅读闭关评述着那本被广泛接受的参考手册,它也被作为ANSI C++标准化的基础文件。这些人的名字可以在《The Annotated C++ Reference Manual》(《带标注的C++参考手册》)[Ellis,1989]中找到。最后,ANSI的X3J16委员会于1989年12月在Hewlett-Packard的建议下建立起来。到1991年7月,这个ANSI(美国国内的)C++标准化变成了ISO(国际)的C++标准化工作的一部分。自1990年起,这个联合的C++标准化委员会就已经成为有关C++的演化和精练其定义的主要论坛。我自始至终在这些文员会中服务,特别是作为有关扩充的工作组的主席,我对有关C++的重要修改以及增加新语言特征的建议的处理直接负责。最初的标准草案在1995年4月提供给公众审阅,ISO C++标准(ISO/IEC 14882)在1998年被批准。

  C++是与本书中描述的某些关键性的类携手一起演化前进的。例如,我设计了复数、向量和堆栈类,以及运算符的重载机制;字符串和表类是Jonathan Shopiro和我一起开发的,作为同一个工作的一部分。Jonathan的字符串和表类作为库的部分最早得到广泛使用。标准C++库的字符串类酒植根于这些早期的工作。在[Stroustrup,1987]和12.7[11]描述的作业库是曾经写出的最早“带类的C”程序。我写出了它及其一些相关的类,是为了支持具有Simula风格的模拟。这个作业库已经被修改并重新实现,主要是由Jonathan Shopiro完成,并一直被广泛使用着。在本书的第一版里描述的流库是我设计和实现的;Jerry Schwarz将其转变为iostream库(第21章),采用了Andrew Koenig的操控符技术(21.4.6节)和其他思想。标准化过程中对这个iostream库做了进一步精练,其中的大量工作是由Jerry Schwarz、Nathan Myers和Norihiro Kumagai完成的。模板功能的开发受到由我、Andrew Koenig、Alex Stepanov等人设计的vector、map、list和sort模板的影响。在另一方面,Alex Stepanov在使用模板的通用型程序设计方面的工作产生出标准C++库的容器和算法部分(16.3节、第17、18章、19.2节)。数值计算的valarray库第22章的基础是Kent Budge的工作。

🔚